package app.productmanagement.web.ProductAndTag.Service;


import app.productmanagement.Pojo.Result;
import app.productmanagement.web.ProductAndTag.Pojo.ProductTag;
import app.productmanagement.web.ProductAndTag.Pojo.ProductTagMultipleTables;
import app.productmanagement.web.ProductAndTag.Service.impl.ProductTagServiceInterface;
import app.productmanagement.web.ProductAndTag.mapper.ProductTagMapper;

import app.productmanagement.web.ProductTag.service.impl.TagServiceInterface;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ProductTagService extends ServiceImpl<ProductTagMapper, ProductTag> implements ProductTagServiceInterface {

    private final ProductTagMapper productTagMapper;
    // 导入 TagServiceInterface 接口
    private final TagServiceInterface tagServiceInterface;
//


    // 添加商品标签关系合集
    //
    private boolean add(ProductTag productTag) {

        // 检查 TagId 在数据库中是否存在
            if (tagServiceInterface.isTagExist(productTag.getTagId())) {
            return false;
        }
        // 检查 ProductId 在数据库中是否存在
        LambdaQueryWrapper<ProductTag> queryWrapper = new LambdaQueryWrapper<>(ProductTag.class)
                .eq(ProductTag::getProductId, productTag.getProductId())
                .eq(ProductTag::getTagId, productTag.getTagId());

        if (!productTagMapper.selectList(queryWrapper).isEmpty()) {
            return false;
        }

        // 添加商品标签关系
        return productTagMapper.insert(productTag) > 0;
    }

    // 添加商品标签关系
    public Result<ProductTag> addProductTag(ProductTag productTag) {
        if (!add(productTag)) {
            return Result.failure("添加失败数据可能重复");
        }
        return Result.success(productTag);
    }

    // 循环 添加商品标签关系
    // 输出 添加商品结果为 true 添加到 List<ProductTag>
    public List<ProductTag> addProductTags(List<ProductTag> productTags) {
        //检查tagId是否存在



        List<ProductTag> productTagList = new ArrayList<>();

        // 循环 添加商品标签关系
        productTags.forEach(
                productTag -> {
                    if (this.add(productTag)) {
                        productTagList.add(productTag);
                    }
                }
        );
        return productTagList;
    }

    // 查询所有商品标签关系
    public Result<List<ProductTag>> getAllProductTags() {
        List<ProductTag> productTags = productTagMapper.selectList(null);
        return Result.success(productTags);
    }

    //删除单个商品标签关系
    public boolean deleteProductTag(Integer product, Integer tag) {

        LambdaQueryWrapper<ProductTag> wrapper = new LambdaQueryWrapper<>(ProductTag.class)
                .eq(ProductTag::getProductId, product)
                .eq(ProductTag::getTagId, tag);
        int delete = productTagMapper.delete(wrapper);
        return delete > 0;
    }

    //通过产品 ID 或 标签 ID 检索产品的 标签ID 或 产品ID。
    public List<ProductTag> getProductTag(Boolean key, Integer id) {
        //通过产品 ID 或 标签 ID 检索产品的 标签ID 或 产品ID。
        //id (必填): 产品 ID 或 标签 ID。
        //key_id(必填): true：通过产品 ID 检索 标签ID
        //             false ：通过标签 ID 检索 产品 ID

        key = key == null || key;
        LambdaQueryWrapper<ProductTag> wrapper = new LambdaQueryWrapper<>(ProductTag.class)
                .eq(key ? ProductTag::getProductId : ProductTag::getTagId, id);

        return productTagMapper.selectList(wrapper);
    }

    //  通过产品 ID 或 标签 ID 删除商品标签关系
    public boolean deleteProductTags(Boolean key, Integer id) {

        // 通过产品 ID 或 标签 ID 检索产品的 标签ID 或 产品ID。
        //id (必填): 产品 ID 或 标签 ID。
        //key_id(必填): true：通过产品 ID 检索 标签ID
        //             false ：通过标签 ID 检索 产品 ID
        key = key == null || key;
        LambdaQueryWrapper<ProductTag> wrapper = new LambdaQueryWrapper<>(ProductTag.class)
                .eq(key ? ProductTag::getProductId : ProductTag::getTagId, id);
        int delete = productTagMapper.delete(wrapper);

        return delete > 0;
    }
}
